package cliente;

/**
 * Correo.java
 */

import java.util.Date;

/**
 * Esta clase implementa un correo con todolos datos precisos para poder envialo
 * 
 * @author Juan Jose Ferreiro Ferreiro
 */
public class Correo {

	private String remitente = null;
	private String[] destinatario = null;
	private String[] cc = null;
	private String asunto = null;
	private String texto = null;;
	private int contadorDest = 1;
	private int contadorCc = 0;

	/**
	 * Este constructor non considera que poida haber mais dun
	 * {@code destinatario}, nin que se lle poida enviar unha copia ({@code CC})
	 * a outros enderezos.
	 * <p>
	 * Sen embargo podense engadir outro {@code destinatario} coa funcion
	 * {@link #engadeDestinatario}
	 * 
	 * @param remitente
	 *            Quen o envia
	 * @param destinatario
	 *            A quen vai dirixido directamente
	 * @param asunto
	 *            Sobre que trata
	 * @param texto
	 *            Corpo do correo
	 * 
	 * @see #engadeDestinatario
	 */
	public Correo(String remitente, String destinatario, String asunto, String texto) {
		this.destinatario = new String[20];
		this.cc = new String[20];

		this.remitente = remitente;
		this.destinatario[0] = destinatario;
		this.asunto = asunto;
		this.texto = texto;
	}

	/**
	 * Construe un {@code Correo} completando todolos campos.
	 * <p>
	 * Podense engadir mais {@code destinatarios} e {@code cc} coas funcions
	 * {@link #engadeDestinatario} e {@link #engadeCc}
	 * 
	 * @param remitente
	 *            Quen o envia
	 * @param destinatarios
	 *            A quen(es) vai dirixido
	 * @param cc
	 *            A quen(es) se lle envia unha copia
	 * @param asunto
	 *            Sobre que trata
	 * @param texto
	 *            Corpo do correo
	 * 
	 * @see #engadeDestinatario
	 * @see #engadeCc
	 */
	public Correo(String remitente, String[] destinatarios, String[] cc, String asunto, String texto) {
		this.cc = cc;
		this.contadorCc = cc == null ? 0 : cc.length;
		this.remitente = remitente;
		this.destinatario = destinatarios;
		this.contadorDest = destinatarios.length;
		this.asunto = asunto;
		this.texto = texto;
	}

	/**
	 * Crea un {@code Correo} a partires dun correo almacenado
	 * 
	 * @param todo
	 *            Representa o correo
	 * @throws java.lang.Exception
	 */
	public Correo(String todo) throws Exception {
		String[] partes = todo.split("\n");
		this.contadorDest = 0;
		for (int i = 0; i < partes.length; i++) {
			String tmp = partes[i].toLowerCase().trim();
			if (tmp.startsWith("from:")) {
				this.remitente = partes[i].substring(5).trim();
			} else if (tmp.startsWith("subject:")) {
				this.asunto = partes[i].substring(8).trim();
			} else if (tmp.startsWith("to:")) {
				this.destinatario = partes[i].substring(3).trim().split(";");
				if (destinatario.length == 1) {
					this.destinatario = partes[i].substring(3).trim().split(",");
				}
				this.contadorDest = this.destinatario.length;
			}
		}

		if (remitente == null || contadorDest == 0)
			throw new Exception("Formato de correo incorrecto. Correo:\n" + todo);
		this.texto = todo;
	}

	/**
	 * Obten os enderezos aos que se lles envia unha copia
	 * 
	 * @return Os enderezos aos que se lles envia unha copia
	 */
	public String[] getCc() {
		return cc;
	}

	/**
	 * Obten o asunto
	 * 
	 * @return O asunto
	 */
	public String getAsunto() {
		return asunto;
	}

	/**
	 * Obten os enderezos aos que se lles envia directamente
	 * 
	 * @return Os enderezos aos que se lles envia
	 */
	public String[] getDestinatario() {
		return destinatario;
	}

	/**
	 * Obten o remitente que o envia
	 * 
	 * @return Quen o envia
	 */
	public String getRemitente() {
		return remitente;
	}

	/**
	 * Obten o contido do {@code Correo}
	 * 
	 * @return O corpo principal
	 */
	public String getTexto() {
		return texto;
	}

	/**
	 * Engade un novo destinatario
	 * 
	 * @param novo
	 *            Enderezo do destinatario
	 */
	public void engadeDestinatario(String novo) {
		this.destinatario[contadorDest++] = novo;
	}

	/**
	 * Engade un enderezo para enviarlle unha copia
	 * 
	 * @param novo
	 *            Enderezo do destinatario
	 */
	public void engadeCc(String novo) {
		this.cc[contadorCc++] = novo;
	}

	/**
	 * Obten a cantidade de enderezos que o van recibir directamente
	 * 
	 * @return Numero de destinatarios
	 */
	public int numeroDestinatarios() {
		return contadorDest;
	}

	/**
	 * Obten a cantidade de enderezos que o van recibir como copia
	 * 
	 * @return Numero de copias
	 */
	public int numeroDeCc() {
		return contadorCc;
	}

	/**
	 * Obten unha lista de enderezos destino
	 * 
	 * @return Os enderezos dos destinatarios separados por ";"
	 */
	public String listaDestinatarios() {
		String tmp = "";
		for (int i = 0; i < contadorDest - 1; i++) {
			tmp += destinatario[i] + "; ";
		}
		return tmp + destinatario[contadorDest - 1];
	}

	/**
	 * Obten unha lista de enderezos das copias
	 * 
	 * @return Os enderezos dos destinatarios das copias separados por ";"
	 */
	public String listaCc() {
		String tmp = "";
		for (int i = 0; i < contadorCc - 1; i++) {
			tmp += cc[i] + ", ";
		}
		return tmp + cc[contadorCc - 1];
	}

	/**
	 * Obten o campo o texto engadindolle as cabeceiras necesarias para o envio
	 * 
	 * @return Un {@code String} que representa o {@code Correo}
	 */
	@Override
	public String toString() {
		String tmp = "Date: " + new Date().toString() + "\n";
		tmp += "From: " + this.getRemitente() + "\n";

		for (int i = 0; i < this.numeroDestinatarios(); i++) {
			tmp += "To: " + this.destinatario[i] + "\n";
		}

		if (this.numeroDeCc() > 0) {
			for (int i = 0; i < this.numeroDeCc(); i++) {
				tmp += "Cc: " + this.cc[i] + "\n";
			}
		}

		tmp += "Subject: " + this.getAsunto() + "\n";
		tmp += "\n";
		tmp += this.getTexto();

		return tmp;
	}
}
